#ifndef DRV_ALGORITHM_H
#define DRV_ALGORITHM_H

/**
 * @brief 单变量单输出的函数指针
 */
typedef float (*FuncPtr_t)(float);

/**
 * @brief 带上下文参数的函数指针
 */
typedef float (*FuncWithCtx_t)(float x, void *ctx);

/**
 * @brief 牛顿迭代法的执行状态
 */
typedef enum
{
    NEWTON_SUCCESS = 1,     // 收敛成功
    NEWTON_NO_CONVERGE = 0, // 未收敛
    NEWTON_DERIV_ZERO = -1, // 导数过小
} NewtonStatus_t;

/**
 * @brief 牛顿迭代法
 */
NewtonStatus_t ALGO_NewtonMethod(FuncWithCtx_t f, FuncWithCtx_t df, float x0, void *ctx, float *res);

/**
 * @brief 角度制转弧度制
 */
float ALGO_Deg2Rad(const float deg);

/**
 * @brief 弧度制转角度制
 */
float ALGO_Rad2Deg(const float rad);

/**
 * @brief 将角度限制到[-π, π]
 */
float ALGO_WrapToPi(const float rad);

/**
 * @brief 将角度限制到[-180°, 180°]
 */
float ALGO_WrapTo180(const float deg);

/**
 * @brief 线性映射
 * @param x: 输入值
 * @param iMin: 输入区间的最小值
 * @param iMax: 输入区间的最大值
 * @param oMin: 输出区间的最小值
 * @param oMax: 输出区间的最大值
 * @return 输出值
 */
float ALGO_LinearMap(float x, float iMin, float iMax, float oMin, float oMax);

#endif //DRV_ALGORITHM_H
